package com.sunk.mybatis.mybatisXuexi;

import com.sunk.mybatis.mymybatis.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

/**
 * @Auther: Sunk
 * @Date: 2019/1/22 16:21
 * @Description:
 */
public class MyBatisTest {
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource ="mybatis-config.xml";
        InputStream inputStream= Resources.getResourceAsStream(resource);
        return  new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 1.获取sqlSessionFactory对象：
     *      解析文件的每一个信息保存在Configuration中，返回包含Configuration的DefaultSqlSession
     *      注意：MapperStatement代表一个增删改查的标签的信息
     * 2.获取sqlSession对象
     *      返回一个DefaultSqlSession对象，包括Executor和Configuration
     *      这一步会创建Executor对象
     * 3.获取接口代理对象(MapperProxy)
     *      getMapper,使用MapperProxyFactory创建一个MapperProxy的代理对象。
     *      代理对象里面包含了，DefaultSqlSession(Executor)
     * 4.执行增删改查
     *      1.根据配置文件(全局，sql映射)初始化出Configuration对象
     *      2.创建一个DefaultSqlSession对象，他里面包含Configuration以及
     *          Executor对象(根据配置文件中的defaultExecutorType创建出对应的Exector)。
     *      3.DefaultSqlSession.getMapper(),拿到mapper接口对应的mapperProxy对象
     *      4.执行增删改查
     *          1.调用defaultSqlSession的增删改查(Executor)
     *          2.一开始会创建一个Statement对象。在设置sql入参和返回结果处理之前，
     *          会创建ParameterHandler和ResultSetHandler
     *          3.接着调用statementHandler的预编译方法，
     *              使用ParameterHandler设置参数
     *          4.调用statementHandler的增删改查
     *          5.使用ResultSetHandler处理返回结果
     *
     *      四大对象创建后，都会执行 this.interceptorChain.pluginAll(parameterHandler);
     *      类似的语句，这是加载mybatis插件的方法
     * @throws IOException
     */
    @Test
    public void test1() throws IOException {
        SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
        SqlSession sqlSession=sqlSessionFactory.openSession();
        try{
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            mapper.getUserById("1");
        }catch (Exception e){

        }
    }

    /**
     * 插件编写：
     *  1.编写Interceptor的实现类
     *  2.使用@Intecepts注解完成签名
     *  3.将写好的插件注册到全局配置文件中
     */
}
